#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
//int main()
//{
    //&a;//&--取地址操作符，拿到变量a的地址
//	int a = 20;

    //pa是一个变量，这个变量pa是用来存放地址(指针)的，pa叫指针变量
//	int* pa = &a;
//	printf("%p\n", pa);
//	return 0;
//}


//int main()
//{
//    int a = 20;
//    int* pa = &a;
//    //* - 解引用操作符（间接访问操作符）
//    *pa = 0;
//    printf("%d ", a);
//    return 0;
//}


// 指针变量的⼤⼩
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位（即4个字节）
//64位平台下地址是64个bit位（即8个字节）
//int main()
//{
//    printf("%zd\n", sizeof(int*));
//    printf("%zd\n", sizeof(char*));
//    printf("%zd\n", sizeof(float*));
//    printf("%zd\n", sizeof(double*));
//    return 0;
//}

//int main()
//{
//    int n = 0x11223344;
//    //int* pi = &n;
//    char* pc = &n;
//    //*pi = 0;
//    *pc = 0;
//    printf("%p", n);
//    return 0;
//}


//指针+-整数
//int main()
//{
//    int a = 20;
//    int* pa = &a;
//    char* pc = &a;
//    printf("&a = %p\n", &a);
//    printf("pa = %p\n", pa);
//    printf("pc = %p\n", pc);
//    printf("&a + 1 = %p\n", &a + 1);
//    printf("pa + 1 = %p\n", pa + 1);
//    printf("pc + 1 = %p\n", pc + 1);
//
//    return 0;
//}

// void* 指针
//int main()
//{
//    int a = 0;
//    char c = 'w';
//
//    void* pa = &a;
//    void* pc = &c;
//
//    return 0;
//}

// const 修饰指针


//int main()
//{
//    int m = 10;
//    m = 20;//m是可以修改的
//    int const n = 20;
//    n = 10;//n是不能被修改的
//    return 0;
//}

// 但是通过指针可以修改
//int main()
//{
//    int const n = 20;
//    printf("%d\n", n);
//    int* pn = &n;
//    *pn = 50;
//    printf("%d\n", n);
//    return 0;
//}


//const修饰指针变量
//1.const在指针左边:不能通过指针改变
//int main()
//{
//    int a = 10;
//    const int* pa = &a;
//    *pa = 50;
//    printf("%d\n", a);
//    return 0;
//}

//2.const在指针右边:可以通过指针改变
//int main()
//{
//    int a = 0;
//    int* const pa = &a;
//    *pa = 20;
//    printf("%d\n", a);
//    return 0;
//}

//• 指针+- 整数
//int main()
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//    int* p = &arr[0];
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int i = 0;
//    for (i = 0; i < sz; i++) {
//        printf("%d ", *(p + i));
//    }
//    return 0;
//}


//• 指针 - 指针
//int main()
//{
//    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//    printf("%d\n", &arr[9] - &arr[0]);
//    printf("%d\n", &arr[0] - &arr[9]);
//    return 0;
//}

//int my_strlen(char *p)
//{
//    char* start = p;
//    char* end = p;
//    while (*end) {
//        end++;
//    }
//    return end - start;
//}
//
//
//int main()
//{
//    char arr[] = "abdcef";
//    size_t len = my_strlen(arr);//数组名其实是数组首元素的地址 arr == &arr[0]
//    printf("%zd\n", len);
//    return 0;
//}

//assert 断⾔
#include<assert.h>
//int main()
//{
//    int a = 0;
//    int* p = NULL;
//    assert(p != NULL);
//    return 0;
//}

// 求字符串长度
//参数s指向的字符串不期望被修改
//size_t my_strlen(const char *s)
//{
//    size_t count = 0;
//    assert(s != 0);
//    while (*s) {
//        count++;
//        s++;
//    }
//    return count;
//}
//
//int main()
//{
//    char arr[] = "abcdef";
//    size_t len = my_strlen(arr);
//    printf("%zd\n", len);
//    printf("%s\n", arr);
//    return 0;
//}


// 传址调⽤
//写一个函数，交换两个整型变量的值
//void swap(int* x, int* y)
//{
//    int z = 0;
//    z = *x;
//    *x = *y;
//    *y = z;
//}
//
//int main()
//{
//    int a = 0;
//    int b = 0;
//    scanf("%d %d", &a, &b);
//
//    swap(&a, &b);
//    printf("%d %d", a, b);
//    return 0;
//}

// 传值调⽤
//int add(int x, int y)
//{
//    return x + y;
//}
//
//int main()
//{
//    int a = 0;
//    int b = 0;
//    scanf("%d %d", &a, &b);
//    int c = add(a, b);
//    printf("%d\n", c);
//
//    return 0;
//}